<!DOCTYPE html>
<!-- saved from url=(0127)https://docs.google.com/document/d/e/2PACX-1vSVRvWhE6CEOvOew0MzLfk3YtaBXguEtgKXCvtWOyOkOeYT0IormJUO1phUZTpqiphHUFWnZqP5cNfg/pub -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>WebPerfWG call minutes - Feb 14 2019</title><link rel="shortcut icon" href="https://ssl.gstatic.com/docs/documents/images/kix-favicon7.ico"><meta name="referrer" content="strict-origin-when-cross-origin"><style type="text/css" nonce="">
      @import url("https://fonts.googleapis.com/css?family=Google+Sans");
      @import url("https://fonts.googleapis.com/css?family=Roboto");

      body {
        font-family: Roboto, arial, sans, sans-serif;
        margin: 0;
      }

      iframe {
        border: 0;
        frameborder: 0;
        height: 100%;
        width: 100%;
      }

      #header {
        align-items: center;
        background: white;
        border-bottom: 1px #ccc solid;
        display: flex;
        height: 60px;
        justify-content: space-between;
        position: fixed;
        top: 0;
        width: 100%;
        z-index: 100;
      }

      #header #title {
        font-family: 'Google Sans';
        font-size: large;
        margin: auto 0 auto 20px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 70%;
      }

      #header #interval {
        margin: auto 25px auto 0;
        font-family: Roboto;
        font-size: small;;
      }

      #footer {
        background: #f0f0f0;
        border-bottom: 1px #ccc solid;
        bottom: 0;
        font-family: Roboto;
        font-size: small;
        padding: 10px 10px;
        position: fixed;
        text-align: center;
        width: 100%;
      }

      #contents {
        padding: 100px 20% 50px 20%;
      }

      @media only screen and (max-device-width: 800px) {
        #header {
          border-bottom-width: 5px;
          height: auto;
          display: block;
        }

        #header #title {
          font-size: 3em;
          margin: auto 0 auto 20px;
          width: 90%;
        }

        #header #interval {
          font-size: 1.5em;
          margin: 10px 0 auto 25px;
        }

        #contents {
          padding: 150px 5% 80px;
        }

        #footer {
          font-size: 2em;
        }
      }

      .dash {
        padding: 0 6px;
      }
    </style></head><body><div id="header"><div id="title">WebPerfWG call minutes - Feb 14 2019</div><div id="interval"><span></span></div></div><div id="contents"><style type="text/css">.lst-kix_gwtw5udzi787-0>li:before{content:"\0025cf  "}.lst-kix_gwtw5udzi787-2>li:before{content:"\0025a0  "}.lst-kix_ptzvdd8vhdvg-0>li:before{content:"\0025cf  "}.lst-kix_gwtw5udzi787-1>li:before{content:"\0025cb  "}.lst-kix_ptzvdd8vhdvg-5>li:before{content:"\0025a0  "}.lst-kix_ptzvdd8vhdvg-6>li:before{content:"\0025cf  "}.lst-kix_gwtw5udzi787-7>li:before{content:"\0025cb  "}.lst-kix_gwtw5udzi787-8>li:before{content:"\0025a0  "}.lst-kix_ptzvdd8vhdvg-8>li:before{content:"\0025a0  "}.lst-kix_gwtw5udzi787-6>li:before{content:"\0025cf  "}.lst-kix_ptzvdd8vhdvg-7>li:before{content:"\0025cb  "}.lst-kix_gwtw5udzi787-3>li:before{content:"\0025cf  "}.lst-kix_gwtw5udzi787-4>li:before{content:"\0025cb  "}.lst-kix_gwtw5udzi787-5>li:before{content:"\0025a0  "}.lst-kix_utnlm0b55wi6-4>li:before{content:"-  "}.lst-kix_utnlm0b55wi6-2>li:before{content:"-  "}.lst-kix_utnlm0b55wi6-6>li:before{content:"-  "}ul.lst-kix_ptzvdd8vhdvg-8{list-style-type:none}.lst-kix_utnlm0b55wi6-3>li:before{content:"-  "}.lst-kix_utnlm0b55wi6-7>li:before{content:"-  "}ul.lst-kix_ptzvdd8vhdvg-7{list-style-type:none}ul.lst-kix_ptzvdd8vhdvg-6{list-style-type:none}.lst-kix_utnlm0b55wi6-5>li:before{content:"-  "}ul.lst-kix_utnlm0b55wi6-1{list-style-type:none}ul.lst-kix_utnlm0b55wi6-2{list-style-type:none}ul.lst-kix_utnlm0b55wi6-0{list-style-type:none}ul.lst-kix_utnlm0b55wi6-5{list-style-type:none}.lst-kix_ptzvdd8vhdvg-4>li:before{content:"\0025cb  "}ul.lst-kix_utnlm0b55wi6-6{list-style-type:none}ul.lst-kix_utnlm0b55wi6-3{list-style-type:none}.lst-kix_ptzvdd8vhdvg-3>li:before{content:"\0025cf  "}ul.lst-kix_utnlm0b55wi6-4{list-style-type:none}.lst-kix_utnlm0b55wi6-0>li:before{content:"-  "}ul.lst-kix_ptzvdd8vhdvg-5{list-style-type:none}.lst-kix_ptzvdd8vhdvg-2>li:before{content:"\0025a0  "}ul.lst-kix_ptzvdd8vhdvg-4{list-style-type:none}ul.lst-kix_utnlm0b55wi6-7{list-style-type:none}ul.lst-kix_ptzvdd8vhdvg-3{list-style-type:none}ul.lst-kix_utnlm0b55wi6-8{list-style-type:none}ul.lst-kix_ptzvdd8vhdvg-2{list-style-type:none}ul.lst-kix_ptzvdd8vhdvg-1{list-style-type:none}ul.lst-kix_ptzvdd8vhdvg-0{list-style-type:none}.lst-kix_ptzvdd8vhdvg-1>li:before{content:"\0025cb  "}.lst-kix_utnlm0b55wi6-1>li:before{content:"-  "}.lst-kix_6rx884732cjw-1>li:before{content:"\0025cb  "}.lst-kix_6rx884732cjw-0>li:before{content:"\0025cf  "}.lst-kix_6rx884732cjw-2>li:before{content:"\0025a0  "}ul.lst-kix_gwtw5udzi787-4{list-style-type:none}.lst-kix_6rx884732cjw-5>li:before{content:"\0025a0  "}ul.lst-kix_mzxm6d4vepu9-5{list-style-type:none}ul.lst-kix_gwtw5udzi787-3{list-style-type:none}ul.lst-kix_mzxm6d4vepu9-4{list-style-type:none}ul.lst-kix_gwtw5udzi787-6{list-style-type:none}.lst-kix_6rx884732cjw-4>li:before{content:"\0025cb  "}.lst-kix_6rx884732cjw-6>li:before{content:"\0025cf  "}ul.lst-kix_mzxm6d4vepu9-7{list-style-type:none}ul.lst-kix_gwtw5udzi787-5{list-style-type:none}ul.lst-kix_mzxm6d4vepu9-6{list-style-type:none}ul.lst-kix_gwtw5udzi787-8{list-style-type:none}.lst-kix_6rx884732cjw-3>li:before{content:"\0025cf  "}.lst-kix_6rx884732cjw-7>li:before{content:"\0025cb  "}ul.lst-kix_mzxm6d4vepu9-1{list-style-type:none}ul.lst-kix_gwtw5udzi787-7{list-style-type:none}ul.lst-kix_mzxm6d4vepu9-0{list-style-type:none}ul.lst-kix_mzxm6d4vepu9-3{list-style-type:none}ul.lst-kix_mzxm6d4vepu9-2{list-style-type:none}.lst-kix_utnlm0b55wi6-8>li:before{content:"-  "}ul.lst-kix_gwtw5udzi787-0{list-style-type:none}ul.lst-kix_mzxm6d4vepu9-8{list-style-type:none}ul.lst-kix_gwtw5udzi787-2{list-style-type:none}ul.lst-kix_gwtw5udzi787-1{list-style-type:none}ul.lst-kix_6rx884732cjw-8{list-style-type:none}ul.lst-kix_6rx884732cjw-7{list-style-type:none}.lst-kix_mzxm6d4vepu9-5>li:before{content:"\0025a0  "}.lst-kix_mzxm6d4vepu9-7>li:before{content:"\0025cb  "}.lst-kix_mzxm6d4vepu9-4>li:before{content:"\0025cb  "}.lst-kix_mzxm6d4vepu9-8>li:before{content:"\0025a0  "}ul.lst-kix_6rx884732cjw-2{list-style-type:none}ul.lst-kix_6rx884732cjw-1{list-style-type:none}ul.lst-kix_6rx884732cjw-0{list-style-type:none}.lst-kix_6rx884732cjw-8>li:before{content:"\0025a0  "}ul.lst-kix_6rx884732cjw-6{list-style-type:none}ul.lst-kix_6rx884732cjw-5{list-style-type:none}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}ul.lst-kix_6rx884732cjw-4{list-style-type:none}ul.lst-kix_6rx884732cjw-3{list-style-type:none}.lst-kix_mzxm6d4vepu9-6>li:before{content:"\0025cf  "}.lst-kix_mzxm6d4vepu9-0>li:before{content:"\0025cf  "}.lst-kix_mzxm6d4vepu9-1>li:before{content:"\0025cb  "}.lst-kix_mzxm6d4vepu9-3>li:before{content:"\0025cf  "}.lst-kix_mzxm6d4vepu9-2>li:before{content:"\0025a0  "}ol{margin:0;padding:0}table td,table th{padding:0}.c0{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c11{padding-top:0pt;padding-bottom:3pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c4{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c16{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:26pt;font-family:"Arial";font-style:normal}.c10{color:#ff0000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:italic}.c6{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:italic}.c17{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:20pt;font-family:"Arial";font-style:normal}.c9{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c13{padding-top:20pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c1{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c12{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c15{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c8{margin-left:36pt;padding-left:0pt}.c2{color:inherit;text-decoration:inherit}.c3{padding:0;margin:0}.c5{height:11pt}.c14{margin-left:36pt}.c7{text-indent:36pt}.c18{color:#ff0000}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style><div class="c15"><p class="c11 title" id="h.d9nuvi3tdopa"><span class="c16">WebPerfWG call minutes - Feb 14 2019</span></p><h1 class="c13" id="h.jxa7yfiju9mg"><span class="c17">Participants </span></h1><p class="c1"><span class="c0">Shubhie Panicker, Todd Reifsteck, Thomas Kelly, &nbsp;Steven Bougon, Scott Haseley, Philippe Le Hegaret, Philip Walton, Nate Schloss, Markus Stange, Charles Vazac, Stefan Zager, Benjamin De Kosnik, Andrew Comminos</span></p><h2 class="c4" id="h.6gjipexs8g8m"><span class="c9">Administrative</span></h2><ul class="c3 lst-kix_utnlm0b55wi6-0 start"><li class="c1 c8 li-bullet-0"><span class="c0">Meeting is being recorded, we will post on YouTube.</span></li><li class="c1 c8 li-bullet-0"><span class="c0"><b>Next call</b>: March 8th @ 11AM PST, with next call week after that</span></li></ul><h2 class="c4" id="h.oq7umgo467kv"><span><b>Scheduling API</b>: </span><span class="c12"><a class="c2" href="https://www.google.com/url?q=https://github.com/szager-chromium/timeUntilNextFrame/blob/master/explainer.md&amp;sa=D&amp;source=editors&amp;ust=1613253794345000&amp;usg=AOvVaw3oWYLJ6JbZ9njSB1fZG-QC">frame budget</a></span><span class="c9">&nbsp;</span></h2><p class="c1"><span class="c0"><b>Shubhie</b>: we’ve reviewed the proposal @ TPAC and we’ve been working with partners.</span></p><p class="c1"><span class="c0"><b>Stefan</b>: we’re working towards on origin trial (OT) and APIs are subject to change based on OT</span></p><p class="c1"><span class="c0">… riC passed idle deadline which provides a best guess for amount of time left to run application code before other urgent work - e.g. input events. This roughly maps to next rendering. </span></p><p class="c1"><span class="c0">… we’ve been talking to React team and Maps team at Google. </span></p><p class="c1"><span class="c0"><b>Todd</b>: I’m working with a number of teams at Microsoft to gather feedback, in ~month I should have feedback on usability and value of this API. Stay tuned.</span></p><p class="c1"><span class="c0"><b>Stefan</b>: the feedback on rIC is that they want a signal beyond input event (e.g. currently we return 0 if input is pending); the sophisticated developer use case here is if you’re writing your own render loop. </span></p><p class="c1"><span class="c0"><b>Ryosuke</b>: this API may be problematic for us because we rely on underlying OS that may change screen refresh rate (e.g. throttle to 60 or even 30hz)... </span></p><p class="c1"><span class="c0">… my suggestion is to align with how some of the native APIs tackle this, which is expose this information via rAF.</span></p><p class="c1"><span class="c0"><b>Alternative suggestion</b>: expose this as an argument to rAF or in a callback form.</span></p><p class="c1"><span class="c0"><b>Stefan</b>: … there is no way to know the hardware refresh rate for iOS?</span></p><p class="c1"><span class="c0"><b>Ryosuke</b>: I don’t think there is an API, we would likely have to guess and the system may change the refresh rate.</span></p><p class="c1"><span class="c0">… raf in WebKit fires immediately after vsync, we’re changing this to align with other browsers which is firing after browser finished its work.. However, this has the gotcha that it’s unpredictable.</span></p><p class="c1"><span class="c0"><b>Stefan</b>: so you’re don’t objecting to exposing information but would prefer to see it exposed via rAF. Why only rAF though? The main utility here is while you’re doing the work inside of the frame</span></p><p class="c1 c5"><span class="c0"></span></p><p class="c1 c14"><span class="c10">AI (Stefan, Shubhie, Ryosuke): follow up offline to understand the limitations and proposed rAF considerations here.</span></p><p class="c1 c5"><span class="c0"></span></p><p class="c1"><span class="c0"><b>Todd</b>: Like this API. Currently the time exposed is until rendering steps behind, but then there is also the expected vsync time. Could or should we expose the vsync information?</span></p><p class="c1"><span class="c0"><b>Stefan</b>: Speaking for Chrome, I don’t think we can observe the vsync time. We have looked into this.</span></p><p class="c1"><span>TODO(szager): link to what we found for exposing vsync.</span></p><p class="c1"><span class="c0"><b>Todd</b>: yep, just asking the question, not saying this is a blocker</span></p><h2 class="c4" id="h.3f2eiiylrk3e"><span><b>Scheduling API</b>: </span><span class="c12"><a class="c2" href="https://www.google.com/url?q=https://github.com/szager-chromium/requestPostAnimationFrame/blob/master/explainer.md&amp;sa=D&amp;source=editors&amp;ust=1613253794348000&amp;usg=AOvVaw1p8RwxhsPk83gOZSVv95fR">post-animation-frame callback</a></span></h2><p class="c1"><span class="c0"><b>Stefan</b>: Webkit currently behaves differently from other browsers; currently its scheduled after vsync, whereas other browsers run rAF immediately before we run our update pipeline.</span></p><p class="c1"><span class="c0">… this is observable in WPT tests</span></p><p class="c1"><span class="c0">… why can’t we have both? could we run code immediately after render steps are complete?</span></p><p class="c1"><span class="c0">… developer feedback is that they also want to avoid forced layouts and currently there is no way to gauge that — by scheduling in this slot they can rely on clean read back.</span></p><p class="c1"><span class="c0"><b>Ryosuke</b>: so, this is ~requestPostAnimationFrame?</span></p><p class="c1"><span class="c0"><b>Stefan</b>: yep, or rAF could take two callbacks: one that runs before vs after.</span></p><p class="c1"><span class="c0">… currently rAF does not accept second, we’d have to do some investigation if there is any </span></p><p class="c1"><span class="c0"><b>Ryosuke</b>: (API bikeshed): maybe an option dict</span></p><p class="c1"><span><b>Markus</b>: this was suggested for FF before (</span><span class="c12"><a class="c2" href="https://www.google.com/url?q=https://www.w3.org/Bugs/Public/show_bug.cgi?id%3D28644&amp;sa=D&amp;source=editors&amp;ust=1613253794350000&amp;usg=AOvVaw1-X0JWBEzHRdzbkroJ9qJC">https://www.w3.org/Bugs/Public/show_bug.cgi?id=28644</a></span><span class="c0">&nbsp;), I think this makes sense.</span></p><p class="c1"><span class="c0"><b>Stefan</b>: we have the “VSYNC” signal from GPU process but it’s not directly vsync.. We need to be a little careful here.</span></p><p class="c1"><span class="c0">… we’ve found lots of past requests from this.</span></p><p class="c1"><span class="c0"><b>Todd</b>: definitely see need for this API</span></p><p class="c1"><span class="c0"><b>Ryosuke</b>: that’s precisely why WebKit implementation is as it is.. It buys the developer the most amount of time.</span></p><p class="c1"><span class="c0"><b>Shubhie</b>: clean reads is another use that’s come up a number of times</span></p><p class="c1"><span class="c0"><b>Stefan</b>: doesn’t seem to be controversial.</span></p><p class="c1 c5"><span class="c0"></span></p><p class="c1"><span><b>Shubhie</b>: FYI, scheduling API’s we’re exploring are: </span><span class="c12"><a class="c2" href="https://www.google.com/url?q=https://github.com/spanicker/main-thread-scheduling/blob/master/README.md&amp;sa=D&amp;source=editors&amp;ust=1613253794352000&amp;usg=AOvVaw2mOgdQCkU_SP21ie65B7mK">Overall explainer</a></span><span>, </span><span class="c12"><a class="c2" href="https://www.google.com/url?q=https://groups.google.com/a/chromium.org/d/msg/blink-dev/eLq8t56CbaQ/KdbOY7ZHCwAJ&amp;sa=D&amp;source=editors&amp;ust=1613253794352000&amp;usg=AOvVaw3OFQmOHQ3ObMLgD0beVnrK">I2I on blink-dev</a></span><span>, </span><span class="c12"><a class="c2" href="https://www.google.com/url?q=https://github.com/w3ctag/design-reviews/issues/338&amp;sa=D&amp;source=editors&amp;ust=1613253794353000&amp;usg=AOvVaw1F-McXf99oUpt_ZdwI4KSM">TAG review</a></span></p><p class="c1 c5"><span class="c0"></span></p><p class="c1"><span class="c0"><b>Stefan</b>: we’re considering doing dynamic framerate throttling like in WebKit, and considering exposing an API for it too.. E.g. game developer wanting to drive 30hz instead of 60Hz because the latter is janky.</span></p><p class="c1 c5"><span class="c0"></span></p><p class="c1"><span class="c0"><b>Markus</b>: where can we provide feedback?</span></p><p class="c1"><span class="c0"><b>Yoav</b>: can we spin up an incubation repo?</span></p><p class="c1 c5"><span class="c0"></span></p><p class="c1"><span class="c18">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AI (Stefan, Shubhie, Yoav): create repos on WICG for scheduling efforts.</span></p><h2 class="c4" id="h.p3cbg0ljmqfh"><span>UserTiming </span><span class="c12"><a class="c2" href="https://www.google.com/url?q=https://w3c.github.io/user-timing/&amp;sa=D&amp;source=editors&amp;ust=1613253794354000&amp;usg=AOvVaw33AxnuMEscpDguVsEXa3uh">L3</a></span></h2><p class="c1"><span class="c0"><b>Nicol&aacute;s</b>: recently landed spec changes we’ve discussed in the past…</span></p><p class="c1"><span class="c0">… both mark and measure now accept optional “detail” field </span></p><p class="c1"><span class="c0">… also both accept timestamp</span></p><p class="c1"><span class="c0">… we added new measureWithOptions because overloading old method is becoming confusing</span></p><p class="c1"><span class="c0">… this new API accepts timestamps in addition to strings as well as “detail” field</span></p><p class="c1"><span class="c0">… all optional parameters go into the dictionary</span></p><p class="c1"><span class="c0">… all the methods are no longer void, they now return the mark/measure object</span></p><p class="c1"><span class="c0">… also, we allow PerformanceMark to be constructed to accommodate Ben Kelly’s SW use case where you don’t want it ot be added to the timeline </span></p><p class="c1"><span class="c0">… all the changes are in the draft, looking for feedback..</span></p><p class="c1"><span class="c0"><b>Ryosuke</b>: why new method, can we override existing?</span></p><p class="c1"><span class="c0"><b>Nicol&aacute;s</b>: it’s not strictly necessary we could make it work but the feedback was that it would be simpler and more ergonomic for developers</span></p><p class="c1"><span class="c0"><b>Philip</b>: I agree with Ryosuke, measureWithOptions feels a little awkward</span></p><p class="c1"><span class="c0"><b>Yoav</b>: are there any compat concerns here? </span></p><p class="c1"><span class="c0"><b>Tim</b>: we did the research and we concluded that compat is not an issue</span></p><p class="c1"><span class="c0"><b>Philip</b>: Nic and Charlie recommended new method, I think it’s more of a personal preference</span></p><p class="c1"><span class="c0"><b>Charles</b>: my perspective was that implementation and developers might have easier time with new method</span></p><p class="c1"><span class="c0"><b>Philippe</b>: measure and measureWithOptions seems harder to remember to me</span></p><p class="c1"><span class="c0"><b>Charles</b>: my comment was based on addEventListener pains we encountered, would like to avoid this…</span></p><p class="c1 c5"><span class="c0"></span></p><p class="c1 c7"><span class="c10"><b>AI</b>: update spec to use measure() and publish L3 draft</span></p><p class="c1 c7"><span class="c10"><b>AI</b>: gather more feedback from developers once we have L3 draft published </span></p><p class="c1 c5 c7"><span class="c6"></span></p><p class="c1"><span><b>Phillippe</b>: I’m publishing L2 REC next week, I can publish L3 at the same time.</span></p></div></div><div id="footer"><span>Published by <a target="_blank" title="Learn more about Google Drive" href="https://docs.google.com/">Google Drive</a></span><span class="dash">–</span><a href="https://docs.google.com/u/0/abuse?id=AKkXjozAtRsqOiRy_NgAy-UQrJm-7qJptAYxc7jwSHzHxKkzwjOqi8Rf12M8meqd55mlrDXjUgNEiXc_Hd3ESD4:0">Report Abuse</a></div><script type="text/javascript" nonce="">(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ca=ba(this);
function da(a,b){if(b)a:{var c=ca;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&aa(c,a,{configurable:!0,writable:!0,value:b})}}var ea="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},fa;
if("function"==typeof Object.setPrototypeOf)fa=Object.setPrototypeOf;else{var ha;a:{var ia={a:!0},ja={};try{ja.__proto__=ia;ha=ja.a;break a}catch(a){}ha=!1}fa=ha?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ka=fa;
function h(a,b){a.prototype=ea(b.prototype);a.prototype.constructor=a;if(ka)ka(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.o=b.prototype}da("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});var l=this||self;function la(){}function ma(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
function na(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function oa(a,b){function c(){}c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.B=function(d,e,f){for(var g=Array(arguments.length-2),k=2;k<arguments.length;k++)g[k-2]=arguments[k];return b.prototype[e].apply(d,g)}}function pa(a){return a};var qa=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function ra(a,b,c){for(var d in a)b.call(c,a[d],d,a)};var m;function p(a,b){this.i=a===sa&&b||"";this.j=ta}p.prototype.h=!0;p.prototype.g=function(){return this.i};var ta={},sa={};var ua=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]},va=/&/g,wa=/</g,xa=/>/g,ya=/"/g,za=/'/g,Aa=/\x00/g,Ba=/[\x00&<>"']/;function Ca(a,b){return a<b?-1:a>b?1:0};function q(a,b){this.i=b===r?a:""}q.prototype.h=!0;q.prototype.g=function(){return this.i.toString()};q.prototype.toString=function(){return this.i.toString()};function u(a){return a instanceof q&&a.constructor===q?a.i:"type_error:SafeUrl"}
var Da=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,Ea=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Fa=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ga(a){if(a instanceof q)return a;a="object"==typeof a&&a.h?a.g():String(a);Fa.test(a)||(a="about:invalid#zClosurez");return new q(a,r)}
var r={},Ha=new q("about:invalid#zClosurez",r);var v;a:{var Ia=l.navigator;if(Ia){var Ja=Ia.userAgent;if(Ja){v=Ja;break a}}v=""}function w(a){return-1!=v.indexOf(a)};function x(a,b,c){this.i=c===Ka?a:""}x.prototype.h=!0;x.prototype.g=function(){return this.i.toString()};x.prototype.toString=function(){return this.i.toString()};var Ka={};function La(a,b,c,d){a=a instanceof q?a:Ga(a);b=b||l;c=c instanceof p?c instanceof p&&c.constructor===p&&c.j===ta?c.i:"type_error:Const":c||"";return void 0!==d?b.open(u(a),c,d,void 0):b.open(u(a),c)};function Ma(a){Ma[" "](a);return a}Ma[" "]=la;function y(a,b,c){return Object.prototype.hasOwnProperty.call(a,b)?a[b]:a[b]=c(b)};var Na=w("Opera"),z=w("Trident")||w("MSIE"),Oa=w("Edge"),Pa=Oa||z,Qa=w("Gecko")&&!(-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"))&&!(w("Trident")||w("MSIE"))&&!w("Edge"),Ra=-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"),Sa=w("Macintosh");function Ta(){var a=l.document;return a?a.documentMode:void 0}var Ua;
a:{var Va="",Wa=function(){var a=v;if(Qa)return/rv:([^\);]+)(\)|;)/.exec(a);if(Oa)return/Edge\/([\d\.]+)/.exec(a);if(z)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ra)return/WebKit\/(\S+)/.exec(a);if(Na)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Wa&&(Va=Wa?Wa[1]:"");if(z){var Xa=Ta();if(null!=Xa&&Xa>parseFloat(Va)){Ua=String(Xa);break a}}Ua=Va}var Ya=Ua,Za={},$a;if(l.document&&z){var ab=Ta();$a=ab?ab:parseInt(Ya,10)||void 0}else $a=void 0;var bb=$a;function cb(a){return y(a.prototype,"$$generatedClassName",function(){return"Class$obf_"+{valueOf:function(){return++db}}})}var db=1E3;function A(){}A.prototype.u=function(){return this.j||(Object.defineProperties(this,{j:{value:++eb,enumerable:!1}}),this.j)};A.prototype.toString=function(){var a=B(fb(gb(this.constructor)))+"@";var b=(this.u()>>>0).toString(16);return a+B(b)};function D(){}h(D,A);D.prototype.i=function(a){this.h=a;if(a instanceof Object)try{a.A=this}catch(b){}};function hb(a){a.h instanceof Error&&(Error.captureStackTrace?Error.captureStackTrace(a.h):a.h.stack=Error().stack)}D.prototype.toString=function(){var a=fb(gb(this.constructor)),b=this.l;return null==b?a:B(a)+": "+B(b)};function ib(){}h(ib,D);function jb(){}h(jb,ib);var eb=0;function E(){}h(E,jb);E.prototype.i=function(a){jb.prototype.i.call(this,Object.is(this.g,"__noinit__")?a:this.g)};function kb(){}h(kb,E);function lb(a,b){return"string"==typeof a?a.charCodeAt(b):a.g(b)};function B(a){return null==a?"null":a.toString()}function mb(a){return 65536<=a?B(String.fromCharCode((55296+((a-65536|0)>>10&1023)|0)&65535))+B(String.fromCharCode((56320+((a-65536|0)&1023)|0)&65535)):String.fromCharCode(a&65535)}function nb(a,b){var c=b,d=a.length,e;b=lb(a,(e=c,c=c+1|0,e));var f;if(e=55296<=b&&56319>=b&&c<d)a=f=lb(a,c),e=56320<=a&&57343>=a;var g;e?g=65536+((b&1023)<<10)+(f&1023)|0:g=b;return g};function ob(a,b){this.h=a;this.g=b}h(ob,A);function fb(a){var b=cb(a.h);0!=a.g&&(b="L"+B(b)+";");a=a.g;for(var c="",d=0;d<a;d=d+1|0)c=B(c)+"[";return B(c)+B(b)}ob.prototype.toString=function(){return"class "+B(fb(this))};function gb(a){var b=0;return y(a.prototype,"$$class/"+b,function(){return new ob(a,b)})};function pb(a,b){return null==a?a:b?decodeURI(a):decodeURIComponent(a)};var qb=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\S\s]*))?$/;function rb(a){a=qb.exec(a);for(var b=[],c=0;7>=c;c=c+1|0)a.length<=c||null==a[c]?b.push(null):b.push(a[c]);return b}
function sb(a,b){var c=a.indexOf(mb(35));c=0>c?a.length:c;a:{var d=0;for(var e=b.length;0<(d=a.indexOf(b,d))&&d<c;){var f=nb(a,d-1|0);if(38==f||63==f){if((d+e|0)>=a.length)break a;f=nb(a,d+e|0);if(61==f||38==f||35==f)break a}d=d+(e+1)|0}d=-1}if(0>d)return null;e=a.indexOf(mb(38),d);if(0>e||e>c)e=c;d=d+(b.length+1)|0;b=Math.min(a.length,d);a=a.substr(b,Math.min(a.length,Math.max(d,e))-b|0);c=" ";for(b=0;0<=(b=c.indexOf("\\",b));)36==c.charCodeAt(b+1|0)?(d=B(c.substr(0,b|0))+"$",e=b=b+1|0,c=d+B(c.substr(e))):
(d=B(c.substr(0,b|0)),e=b=b+1|0,c=d+B(c.substr(e)));a=a.replace(/\+/g,c);return pb(a,!1)};function F(a,b){this.h=b;for(var c=[],d=!0,e=a.length-1;0<=e;e--){var f=a[e]|0;d&&f==b||(c[e]=f,d=!1)}this.g=c}var tb={};function ub(a){return-128<=a&&128>a?y(tb,a,function(b){return new F([b|0],0>b?-1:0)}):new F([a|0],0>a?-1:0)}function G(a){if(isNaN(a)||!isFinite(a))return H;if(0>a)return I(G(-a));for(var b=[],c=1,d=0;a>=c;d++)b[d]=a/c|0,c*=4294967296;return new F(b,0)}var H=ub(0),J=ub(1),vb=ub(16777216);
function K(a){if(-1==a.h)return-K(I(a));for(var b=0,c=1,d=0;d<a.g.length;d++){var e=L(a,d);b+=(0<=e?e:4294967296+e)*c;c*=4294967296}return b}F.prototype.toString=function(a){a=a||10;if(2>a||36<a)throw Error("radix out of range: "+a);if(M(this))return"0";if(-1==this.h)return"-"+I(this).toString(a);for(var b=G(Math.pow(a,6)),c=this,d="";;){var e=wb(c,b).g;c=N(c,O(e,b));var f=((0<c.g.length?c.g[0]:c.h)>>>0).toString(a);c=e;if(M(c))return f+d;for(;6>f.length;)f="0"+f;d=f+d}};
function L(a,b){return 0>b?0:b<a.g.length?a.g[b]:a.h}function M(a){if(0!=a.h)return!1;for(var b=0;b<a.g.length;b++)if(0!=a.g[b])return!1;return!0}function P(a,b){a=N(a,b);return-1==a.h?-1:M(a)?0:1}function I(a){for(var b=a.g.length,c=[],d=0;d<b;d++)c[d]=~a.g[d];return(new F(c,~a.h)).add(J)}F.prototype.abs=function(){return-1==this.h?I(this):this};
F.prototype.add=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0,e=0;e<=b;e++){var f=d+(L(this,e)&65535)+(L(a,e)&65535),g=(f>>>16)+(L(this,e)>>>16)+(L(a,e)>>>16);d=g>>>16;f&=65535;g&=65535;c[e]=g<<16|f}return new F(c,c[c.length-1]&-2147483648?-1:0)};function N(a,b){return a.add(I(b))}
function O(a,b){if(M(a)||M(b))return H;if(-1==a.h)return-1==b.h?O(I(a),I(b)):I(O(I(a),b));if(-1==b.h)return I(O(a,I(b)));if(0>P(a,vb)&&0>P(b,vb))return G(K(a)*K(b));for(var c=a.g.length+b.g.length,d=[],e=0;e<2*c;e++)d[e]=0;for(e=0;e<a.g.length;e++)for(var f=0;f<b.g.length;f++){var g=L(a,e)>>>16,k=L(a,e)&65535,t=L(b,f)>>>16,n=L(b,f)&65535;d[2*e+2*f]+=k*n;Q(d,2*e+2*f);d[2*e+2*f+1]+=g*n;Q(d,2*e+2*f+1);d[2*e+2*f+1]+=k*t;Q(d,2*e+2*f+1);d[2*e+2*f+2]+=g*t;Q(d,2*e+2*f+2)}for(e=0;e<c;e++)d[e]=d[2*e+1]<<16|
d[2*e];for(e=c;e<2*c;e++)d[e]=0;return new F(d,0)}function Q(a,b){for(;(a[b]&65535)!=a[b];)a[b+1]+=a[b]>>>16,a[b]&=65535,b++}function S(a,b){this.g=a;this.h=b}
function wb(a,b){if(M(b))throw Error("division by zero");if(M(a))return new S(H,H);if(-1==a.h)return b=wb(I(a),b),new S(I(b.g),I(b.h));if(-1==b.h)return b=wb(a,I(b)),new S(I(b.g),b.h);if(30<a.g.length){if(-1==a.h||-1==b.h)throw Error("slowDivide_ only works with positive integers.");for(var c=J,d=b;0>=P(d,a);)c=xb(c,1),d=xb(d,1);var e=T(c,1),f=T(d,1);d=T(d,2);for(c=T(c,2);!M(d);){var g=f.add(d);0>=P(g,a)&&(e=e.add(c),f=g);d=T(d,1);c=T(c,1)}b=N(a,O(e,b));return new S(e,b)}for(e=H;0<=P(a,b);){c=Math.max(1,
Math.floor(K(a)/K(b)));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);f=G(c);for(g=O(f,b);-1==g.h||0<P(g,a);)c-=d,f=G(c),g=O(f,b);M(f)&&(f=J);e=e.add(f);a=N(a,g)}return new S(e,a)}F.prototype.and=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)&L(a,d);return new F(c,this.h&a.h)};F.prototype.or=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)|L(a,d);return new F(c,this.h|a.h)};
F.prototype.xor=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)^L(a,d);return new F(c,this.h^a.h)};function xb(a,b){var c=b>>5;b%=32;for(var d=a.g.length+c+(0<b?1:0),e=[],f=0;f<d;f++)e[f]=0<b?L(a,f-c)<<b|L(a,f-c-1)>>>32-b:L(a,f-c);return new F(e,a.h)}function T(a,b){var c=b>>5;b%=32;for(var d=a.g.length-c,e=[],f=0;f<d;f++)e[f]=0<b?L(a,f+c)>>>b|L(a,f+c+1)<<32-b:L(a,f+c);return new F(e,a.h)};N(xb(J,32),J);N(xb(J,128),J);function yb(a){a&&"function"==typeof a.v&&a.v()};function U(){this.h=this.h;this.g=this.g}U.prototype.h=!1;U.prototype.v=function(){this.h||(this.h=!0,this.j())};U.prototype.j=function(){if(this.g)for(;this.g.length;)this.g.shift()()};var zb=!z||9<=Number(bb),Ab=!z||9<=Number(bb),Bb=z&&!y(Za,"9",function(){for(var a=0,b=ua(String(Ya)).split("."),c=ua("9").split("."),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var f=b[e]||"",g=c[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;a=Ca(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||Ca(0==f[2].length,0==g[2].length)||Ca(f[2],g[2]);f=f[3];g=g[3]}while(0==a)}return 0<=a}),
Cb=function(){if(!l.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{l.addEventListener("test",la,b),l.removeEventListener("test",la,b)}catch(c){}return a}();function Db(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1}Db.prototype.h=function(){this.defaultPrevented=!0};function V(a,b){Db.call(this,a?a.type:"");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(Qa){a:{try{Ma(b.nodeName);var e=!0;break a}catch(f){}e=
!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=
a.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:Eb[a.pointerType]||"";this.state=a.state;this.i=a;a.defaultPrevented&&V.o.h.call(this)}}oa(V,Db);var Fb=[1,4,2],Eb={2:"touch",3:"pen",4:"mouse"};V.prototype.h=function(){V.o.h.call(this);var a=this.i;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,Bb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var Gb="closure_listenable_"+(1E6*Math.random()|0);var Hb=0;function Ib(a,b,c,d,e){this.listener=a;this.g=null;this.src=b;this.type=c;this.capture=!!d;this.h=e;this.key=++Hb;this.m=this.s=!1}function Jb(a){a.m=!0;a.listener=null;a.g=null;a.src=null;a.h=null};function Kb(a){this.src=a;this.g={};this.h=0}Kb.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g;a:{for(g=0;g<a.length;++g){var k=a[g];if(!k.m&&k.listener==b&&k.capture==!!d&&k.h==e)break a}g=-1}-1<g?(b=a[g],c||(b.s=!1)):(b=new Ib(b,this.src,f,!!d,e),b.s=c,a.push(b));return b};function Lb(a,b){var c=b.type;if(c in a.g){var d=a.g[c],e=qa(d,b),f;(f=0<=e)&&Array.prototype.splice.call(d,e,1);f&&(Jb(b),0==a.g[c].length&&(delete a.g[c],a.h--))}};var Mb="closure_lm_"+(1E6*Math.random()|0),Nb={},Ob=0;function Pb(a,b,c,d,e){if(d&&d.once)return Qb(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)Pb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!1,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!1,d,e)}
function Sb(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=ma(e)?!!e.capture:!!e,k=Tb(a);k||(a[Mb]=k=new Kb(a));c=k.add(b,c,d,g,f);if(c.g)return c;d=Ub();c.g=d;d.src=a;d.listener=c;if(a.addEventListener)Cb||(e=g),void 0===e&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(Vb(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");Ob++;return c}
function Ub(){var a=Wb,b=Ab?function(c){return a.call(b.src,b.listener,c)}:function(c){c=a.call(b.src,b.listener,c);if(!c)return c};return b}function Qb(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)Qb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!0,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!0,d,e)}
function Xb(a){if("number"!==typeof a&&a&&!a.m){var b=a.src;if(b&&b[Gb])Lb(b.g,a);else{var c=a.type,d=a.g;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(Vb(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Ob--;(c=Tb(b))?(Lb(c,a),0==c.h&&(c.src=null,b[Mb]=null)):Jb(a)}}}function Vb(a){return a in Nb?Nb[a]:Nb[a]="on"+a}
function Yb(a,b,c,d){var e=!0;if(a=Tb(a))if(b=a.g[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var f=b[a];f&&f.capture==c&&!f.m&&(f=Zb(f,d),e=e&&!1!==f)}return e}function Zb(a,b){var c=a.listener,d=a.h||a.src;a.s&&Xb(a);return c.call(d,b)}
function Wb(a,b){if(a.m)return!0;if(!Ab){if(!b)a:{b=["window","event"];for(var c=l,d=0;d<b.length;d++)if(c=c[b[d]],null==c){b=null;break a}b=c}d=b;b=new V(d,this);c=!0;if(!(0>d.keyCode||void 0!=d.returnValue)){a:{var e=!1;if(0==d.keyCode)try{d.keyCode=-1;break a}catch(g){e=!0}if(e||void 0==d.returnValue)d.returnValue=!0}d=[];for(e=b.g;e;e=e.parentNode)d.push(e);a=a.type;for(e=d.length-1;0<=e;e--){b.g=d[e];var f=Yb(d[e],a,!0,b);c=c&&f}for(e=0;e<d.length;e++)b.g=d[e],f=Yb(d[e],a,!1,b),c=c&&f}return c}return Zb(a,
new V(b,this))}function Tb(a){a=a[Mb];return a instanceof Kb?a:null}var $b="__closure_events_fn_"+(1E9*Math.random()>>>0);function Rb(a){if("function"===typeof a)return a;a[$b]||(a[$b]=function(b){return a.handleEvent(b)});return a[$b]};function W(a){U.call(this);this.l=a;this.i={}}oa(W,U);var ac=[];function bc(a){ra(a.i,function(b,c){this.i.hasOwnProperty(c)&&Xb(b)},a);a.i={}}W.prototype.j=function(){W.o.j.call(this);bc(this)};W.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function cc(a){U.call(this);this.i=a||document.body;this.l=new W(this);a=na(yb,this.l);this.h?a():(this.g||(this.g=[]),this.g.push(a));a=this.l;var b=this.i,c=this.u,d="click";Array.isArray(d)||(d&&(ac[0]=d.toString()),d=ac);for(var e=0;e<d.length;e++){var f=Pb(b,d[e],c||a.handleEvent,!1,a.l||a);if(!f)break;a.i[f.key]=f}}h(cc,U);
cc.prototype.u=function(a){if(!(!(zb?0==a.i.button:"click"==a.type||a.i.button&Fb[0])||Sa&&a.ctrlKey||a.defaultPrevented))for(var b=a.target;b&&b!=this.i;){if(b.tagName&&"a"==b.tagName.toLowerCase()){var c=b.getAttribute("href")||b.getAttributeNS("http://www.w3.org/1999/xlink","href"),d=c;try{var e=rb(c)[3];var f;if(f="www.google.com"===pb(e,!0)){var g=rb(c)[5];f="/url"===pb(g,!0)}if(f){var k=sb(c,"q");d=k?k:sb(c,"url")}}catch(C){a:{var t=C;if(null!=t){var n=t.A;if(null!=n){C=n;break a}}if(t instanceof
TypeError){var R=n=new kb;R.l=B(t);hb(R);n.g="__noinit__";n.g=t;n.i(new TypeError(n));t=n}else R=n=new E,R.l=B(t),hb(R),n.g="__noinit__",n.g=t,n.i(Error(n)),t=n;C=t}if(!(C instanceof ib))throw C.h;}d=null!=d?d:"";if(c!=d){e=void 0;b={target:"_blank",noreferrer:!0};c=window;d instanceof q?f=d:(f="undefined"!=typeof d.href?d.href:String(d),f instanceof q||(f="object"==typeof f&&f.h?f.g():String(f),Fa.test(f)?f=new q(f,r):(f=String(f),f=f.replace(/(%0A|%0D)/g,""),f=(g=f.match(Ea))&&Da.test(g[1])?new q(f,
r):null)),f=f||Ha);d=b.target||d.target;g=[];for(e in b)switch(e){case "width":case "height":case "top":case "left":g.push(e+"="+b[e]);break;case "target":case "noopener":case "noreferrer":break;default:g.push(e+"="+(b[e]?1:0))}e=g.join(",");if((w("iPhone")&&!w("iPod")&&!w("iPad")||w("iPad")||w("iPod"))&&c.navigator&&c.navigator.standalone&&d&&"_self"!=d)e="A",g=document,e=String(e),"application/xhtml+xml"===g.contentType&&(e=e.toLowerCase()),g=e=g.createElement(e),f=f instanceof q?f:Ga(f),g.href=
u(f),e.setAttribute("target",d),b.noreferrer&&e.setAttribute("rel","noreferrer"),b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,c,1),e.dispatchEvent(b);else if(b.noreferrer){if(c=La("",c,d,e),b=u(f),c){Pa&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'");c.opener=null;Ba.test(b)&&(-1!=b.indexOf("&")&&(b=b.replace(va,"&amp;")),-1!=b.indexOf("<")&&(b=b.replace(wa,"&lt;")),-1!=b.indexOf(">")&&(b=b.replace(xa,"&gt;")),-1!=b.indexOf('"')&&(b=b.replace(ya,"&quot;")),-1!=b.indexOf("'")&&
(b=b.replace(za,"&#39;")),-1!=b.indexOf("\x00")&&(b=b.replace(Aa,"&#0;")));b='<meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0; url='+b+'">';if(void 0===m)if(d=null,(e=l.trustedTypes)&&e.createPolicy){try{d=e.createPolicy("goog#html",{createHTML:pa,createScript:pa,createScriptURL:pa})}catch(C){l.console&&l.console.error(C.message)}m=d}else m=d;b=(d=m)?d.createHTML(b):b;b=new x(b,null,Ka);(c=c.document)&&c.write&&(c.write(b instanceof x&&b.constructor===x?b.i:"type_error:SafeHtml"),
c.close())}}else(c=La(f,c,d,e))&&b.noopener&&(c.opener=null);a.h();break}}b=b.parentNode}};function dc(a){new cc(a)}var X=["DOCS_installLinkReferrerSanitizer"],Y=l;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===dc?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=dc;}).call(this);
</script><script type="text/javascript" nonce="">DOCS_installLinkReferrerSanitizer();</script></body></html>